<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 生成器函数
    // function fn() {
    //     console.log('我是函数');
    // }
    // fn() 
    // generator函数的声明
    function* fn() {
        console.log('我是生成器函数');
        yield '我是生成器函数2'
        console.log('我是生成器函数3');
        yield '我是生成器函数4'
        console.log('我是生成器函数5');
    }
    // 调用生成器函数 需要next()
    // fn().next()
    let item = fn()
    // 返回一个generator对象，对象的原型上有一个next(),调用返回对象{value:yield后面的值,done}
    console.log(item);
    // item.next()
    console.log(item.next());
    console.log(item.next());
    item.next()
    /*
      yield和return的区别
            yield：暂停执行，调用next()继续执行
            return：结束执行
    */

    //    next( )方法还可以接受一个参数，它的参数会作为上一个yield的返回值
    function* demo() {
        let res = yield '我是1'
        console.log(res);
        let res_1 = yield res
        console.log(res_1);
    }
    let ite = demo()
    console.log(ite.next());
    console.log(ite.next('我是参数'));
    ite.next('我是参数1')
    // 在一个Generator函数里面，如果我们想调用另一个Generator函数，就需要用到的关键字是：yield*
    function* fn_1() {
        console.log('fn_1');
    }

    function* fn_2() {
        console.log('fn_2');
    }

    function* fn_3() {
        console.log('fn_3');
    }

    function* fn_4() {
        yield* fn_1()
        yield* fn_2()
        yield* fn_3()
    }
    let it = fn_4()
    it.next()
</script>

</html>